﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Busconeitor.Domain.Entities;

namespace Busconeitor.BusinessLayer
{
    public class VocabularioRules
    {
        private VocabularioEntity _vocabulario;

        public VocabularioRules(VocabularioEntity vocabulario)
        {
            _vocabulario = vocabulario;
        }

        public void ProcesarPalabrasDesdeDocumento(DocumentoEntity documento)
        {
            foreach (var palabra in documento.PalabrasRepresentativas)
            {
                if (_vocabulario.Terminos.ContainsKey(palabra))
                {
                    //Si la palabra existe, recuperar el Termino.
                    var termino = _vocabulario.Terminos[palabra];
                    ProcesarTerminoExistente(termino, documento);
                }
                else
                {
                    //Si la palabra no existe, crear el Termino.
                    ProcesarPalabraNueva(palabra, documento);
                }
            }
        }

        private void ProcesarPalabraNueva(string palabra, DocumentoEntity documento)
        {
            var nuevoTermino = new TerminoEntity(palabra);
            //Crear el Posteo y agregar el Documento.
            var nuevoPosteo = new PosteoEntity(documento);
            nuevoTermino.Posteos.Add(nuevoPosteo);
            //Actualiza los contadores.
            nuevoTermino.ActualizarContadores();
        }

        private void ProcesarTerminoExistente(TerminoEntity termino, DocumentoEntity documento)
        {
            //Se fija si en la lista de Posteo ya existe el Documento que esta procesando.
            var posteo = termino.Posteos.SingleOrDefault(x => x.Documento.Id == documento.Id);

            if (posteo != null)
            {
                //Si el Documento existe, actualiza la frecuencia.
                posteo.ActualizarFrecuencia();
            }
            else
            {
                //Si el Documento no existe, crear un Posteo y agregar el Documento.    
                posteo = new PosteoEntity(documento);
                termino.Posteos.Add(posteo);
            }

            //Actualiza los contadores de Termino.
            termino.ActualizarContadores();
        }
    }
}
